#include "Juego.h"
#include "ProcesoPrincipal.h"

Juego::Juego(int j1, int j2, ProcesoPrincipal *p){ 
	jugadores.push_back(j1);
	jugadores.push_back(j2);
	srand(time(NULL));
	turno = rand()%100;
	estado=ESTADO_INVALIDO;
	proceso = p;
}

void Juego::limpiar(){
	turno = rand()%100;
	estado=ESTADO_INVALIDO;
	turnoElegido.clear();
}

int Juego::getJugador(int indice){
	return jugadores[indice];
}
	
int Juego::getEstado(){ return estado;}

	
void Juego::recibirMensaje(Mensaje* m){
	int origen = m->getFuente();
	int destino = m->getFuente()==jugadores[0]?jugadores[1]:jugadores[0];

	if(m->getTipo() == MENSAJE_DISPARO){
		char x=0,y=0;
		x = ((MensajeDisparo*)m)->getX();
		y = ((MensajeDisparo*)m)->getY();
		int casillero = proceso->jugadores[destino].getTablero(0).getCasillero(x,y);

		if( casillero == AGUA || casillero == BARCO){
			//Casillero válido
			int resultado;
			resultado = proceso->jugadores[destino].getTablero(0).recibirDisparo(x,y);
			proceso->jugadores[origen].getTablero(1).setCasillero(x,y,resultado);
			proceso->enviarMensaje(destino, m);				
			if(proceso->jugadores[destino].getTablero(0).getCantidadBarcos()==0){
				MensajeGanar ganar;
				proceso->enviarMensaje(origen, &ganar);
				MensajePerder perder;
				proceso->enviarMensaje(destino, &perder);
				limpiar();
			}
			MensajeCederTurno ceder;
			proceso->enviarMensaje(destino, &ceder);

		}
		else{
			//Ya se disparó a esa posición
			Lock l(std::dbg);
			std::dbg << "No se puede disparar a una posicion repetida.\n";
			MensajeNotificacion notificacion("No se puede disparar a una posicion repetida.");
			proceso->enviarMensaje(origen, &notificacion);
			MensajeCederTurno ceder;
			proceso->enviarMensaje(origen, &ceder);
		}

	}
	else if(m->getTipo() == MENSAJE_ELEGIR_TURNO){
		turnoElegido[m->getFuente()] = abs(((MensajeElegirTurno*)m)->getNumero()-turno);
		if(turnoElegido.size() >= 2){
			MensajeCederTurno ceder;

			int destinatario;
			int origen;
			if(turnoElegido[jugadores[0]] <= turnoElegido[jugadores[1]]){
				destinatario = jugadores[0];
				origen = jugadores[1];
			}
			else{
				destinatario = jugadores[1];
				origen = jugadores[0];
			}

			MensajeNotificacion notif1("Te toca el primer turno.");
			MensajeNotificacion notif2("Te toca el segundo turno.");
			proceso->enviarMensaje(destinatario, &ceder);
			proceso->enviarMensaje(destinatario, &notif1);
			proceso->enviarMensaje(origen, &notif2);
		}
		else{
			MensajeNotificacion notif("Esperando al otro jugador...");
			proceso->enviarMensaje(m->getFuente(), &notif);
		}

	}
	else if(m->getTipo() == MENSAJE_GET_TABLERO){
		MensajeTablero mt;
		mt.setDatos(proceso->jugadores[origen].getTablero(0),proceso->jugadores[origen].getTablero(1));
		proceso->enviarMensaje(origen, &mt);
	}
	else if(m->getTipo() == MENSAJE_TABLERO){
		MensajeTablero *mt = (MensajeTablero*)m;
		mt->getDatos(proceso->jugadores[origen].getTablero(0),proceso->jugadores[origen].getTablero(1));
	}
	else if(m->getTipo() == MENSAJE_CEDER_TURNO){
		proceso->enviarMensaje(destino, m);
	}
	else if(m->getTipo() == MENSAJE_DESCONECTAR){
		std::cout << "Esta jugando\n";
		MensajeDesconectar md;
		proceso->enviarMensaje(destino, &md);

		//Borro el juego
		proceso->juegos.erase(proceso->juegos.find(destino));
		delete proceso->juegos[origen];
		proceso->juegos.erase(proceso->juegos.find(origen));
	}
}
